import * as pro from './action-type';
import Immutable from 'immutable';

let defaultState = {
  /**
   * 商品数据
   * @type {Array}
   * example: [{
   *    product_id: 1, 商品ID 
   *    product_name: "PaiBot（2G/32G)", 商品名称
   *    product_price: 2999, 商品价格
   *    commission: 200, 佣金
   *    selectStatus: false, 是否选择
   *    selectNum: 0, 选择数量
   * }]
   */
  dataList: [],
};

// Immutable Data 就是一旦创建，就不能再被更改的数据。
// 对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。
// Immutable 实现的原理是 Persistent Data Structure（持久化数据结构），也就是使用旧数据创建新数据时，要保证旧数据同时可用且不变。
// 同时为了避免 deepCopy 把所有节点都复制一遍带来的性能损耗，
// Immutable 使用了 Structural Sharing（结构共享），即如果对象树中一个节点发生变化，只修改这个节点和受它影响的父节点，其它节点则进行共享
// 解决shallowCopy（浅拷贝）或 deepCopy（深拷贝）对 CPU 和内存的浪费。
// 并发安全 数据不可变的，并发锁就不需要了。
// 记住每次修改都会返回新的对象！！！
//约定 Immutable对象命名$$开始
// 约定变量命名规则：如所有 Immutable 类型对象以 $$ 开头。
// 使用 Immutable.fromJS 而不是 Immutable.Map 或 Immutable.List 来创建对象，这样可以避免 Immutable 和原生对象间的混用。
//Immutable.is 值比较


// 游标用于多层次数据访问
// let data = Immutable.fromJS({ a: { b: { c: 1 } } });
// // 让 cursor 指向 { c: 1 }
// let cursor = Cursor.from(data, ['a', 'b'], newData => {
//     // 当 cursor 或其子 cursor 执行 update 时调用
//     console.log(newData);
// });
//
// cursor.get('c'); // 1
// cursor = cursor.update('c', x => x + 1);
// cursor.get('c');
// react的性能指标工具react-addons-perf


//在redux中，全局state必须是immutable的，这点毋庸置疑是我们使用immutable来优化redux的核心
// 组件内部state如果需要提交到store的，必须是immutable，否则不强制
// view提交到action中的数据必须是immutable
// Action提交到reducer中的数据必须是immutable
// reducer中最终处理state必须是以immutable的形式处理并返回
// 与服务端ajax交互中返回的callback统一封装，第一时间转换成immutable数据
//

export const proData = (state = defaultState, action) => {
  let imuDataList;
  let imuItem;
  console.log(action);

debugger

  // 如果有一个ajax请求
  // ajax
  // 请求成功后需要回调 callback 函数


    // 如果没有 Promise 会这样写  一层套一层
    // $.ajax({
    //
    // })
    //     .done(function (res) {
    //
    //      callback();
    //
    //     }


  //
  // let promise new Promise((resolve,reject)=>{
  //     })
  //         .done(function (res) {
  //          //这里调用resolve   下面就会执行then里面的函数  resolve 是一个函数 可以传入返回的参数 then 可以接收
  //          resolve()
  //
  //     }
  //
  // });
  //  promise.then(()=>{
  //
  //
  //
  // })
  //

  //  好处就是   代码步骤清晰
  //
  //   可以把then理解成下一步    resolve() 同意执行下一步   reject拒绝就不会执行了
  //






  console.log("proData");
  switch(action.type){
    case pro.GETPRODUCTION:
      return {...state, ...action};
      case pro.TOGGLESELECT:
      //避免引用类型数据，使用immutable进行数据转换
      imuDataList = Immutable.List(state.dataList);
      imuItem = Immutable.Map(state.dataList[action.index]);
      imuItem = imuItem.set('selectStatus', !imuItem.get('selectStatus'));
      imuDataList = imuDataList.set(action.index, imuItem);
      imuDataList.delete(imuItem);
      // redux必须返回一个新的state
      return {...state, ...{dataList: imuDataList.toJS()}};
    case pro.EDITPRODUCTION:
      //避免引用类型数据，使用immutable进行数据转换 
      imuDataList = Immutable.List(state.dataList);
      imuItem = Immutable.Map(state.dataList[action.index]);
      imuItem = imuItem.set('selectNum', action.selectNum);
      imuDataList = imuDataList.set(action.index, imuItem);
      // redux必须返回一个新的state
      return {...state, ...{dataList: imuDataList.toJS()}};
    // 清空数据
    case pro.CLEARSELECTED:
      imuDataList = Immutable.fromJS(state.dataList);
      for (let i = 0; i < state.dataList.length; i++) {
        imuDataList = imuDataList.update(i, item => {
          item = item.set('selectStatus', false);
          item = item.set('selectNum', 0);
          return item
        })
      }
      return {...state, ...{dataList: imuDataList.toJS()}};
    default: 
      return state;
  }
};